/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.brain.capa.manager;

import com.brain.core.manager.*;
import com.brain.core.exception.DAOException;
import com.brain.core.hibernate.dao.DAOGenerico;
import com.brain.capa.dto.VCapaConsolidadoDto;
import com.brain.capa.view.util.ConstantesCapa;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;

/**
 *
 * @author Hvives
 */
@Service
public class VCapaConsolidadoManager extends ComunManager<VCapaConsolidadoDto> implements Serializable {

    @Resource
    private DAOGenerico<VCapaConsolidadoDto> springHibernateDao;
    private static Logger logger = Logger.getLogger(VCapaConsolidadoManager.class);
    @Resource
    private RecursosManager recursosManager;

    public VCapaConsolidadoDto obtenerPorId(Long id) throws DAOException {
        return springHibernateDao.obtenerDtoPorId(VCapaConsolidadoDto.class, id);
    }

    public List<VCapaConsolidadoDto> obtenerConsolidadoTrimesteCantidadEjecutados(String anio) throws DAOException {
        String sql = "select c.trimestre, count(1) from VCAPA_CONSOLIDADO C, TCORE_PARAMETRO CAT ";
        sql += " where c.categoria = cat.id and c.anio = '" + anio + "' and c.id_estado = " + ConstantesCapa.Parametro.PROGRAMACION_EJECUTADO;
        sql += " group by c.trimestre";
        
        List l = springHibernateDao.ejecutarSQL(sql);
        List<VCapaConsolidadoDto> retorno = new ArrayList<VCapaConsolidadoDto>();
        
        for (Object m : l) {            
            Object[] x = (Object[]) m;
            VCapaConsolidadoDto o = new VCapaConsolidadoDto();            
            o.setTrimestre(x[0].toString());
            o.setCantidad(Integer.parseInt(x[1].toString()));
            retorno.add(o);
        }
        
        return retorno;
    }
    
    public List<VCapaConsolidadoDto> obtenerResumenInversionPorArea(String anio) throws DAOException {
        String sql = "SELECT C.AREA,C.AREA_DESCRIPCION ,SUM(C.INVERSION),FC_OBTENER_PRESUP_POR_AREA(C.AREA, '" + anio + "') PRESUPUESTO ";
        sql += "FROM VCAPA_CONSOLIDADO C ";
        sql += " WHERE C.ANIO = '" + anio + "' AND C.ID_ESTADO = " + ConstantesCapa.Parametro.PROGRAMACION_EJECUTADO;;
        sql += " GROUP BY C.AREA,C.AREA_DESCRIPCION";

        List l = springHibernateDao.ejecutarSQL(sql);
        List<VCapaConsolidadoDto> retorno = new ArrayList<VCapaConsolidadoDto>();

        for (Object m : l) {
            Object[] x = (Object[]) m;
            VCapaConsolidadoDto o = new VCapaConsolidadoDto();
            o.setAreaDescripcion(x[1].toString());
            BigDecimal inversionAsignada = BigDecimal.valueOf(Long.valueOf(x[3].toString()));
            BigDecimal inversionEjecutada = BigDecimal.valueOf(Long.valueOf(x[2].toString()));
            BigDecimal inversionDisponible = inversionAsignada.subtract(inversionEjecutada);
            o.setInversionEjecutada(inversionEjecutada);
            o.setInversionAsignada(inversionAsignada);
            o.setInversionDisponible(inversionDisponible);
            retorno.add(o);
        }

        return retorno;
    }
    
    public List<VCapaConsolidadoDto> obtenerConsolidadoTrimesteInversionEjecutados(String anio) throws DAOException {
        String sql = "select c.trimestre, sum(c.inversion) from VCAPA_CONSOLIDADO C, TCORE_PARAMETRO CAT ";
        sql += " where c.categoria = cat.id and c.anio = '" + anio + "' and c.id_estado = " + ConstantesCapa.Parametro.PROGRAMACION_EJECUTADO;
        sql += " group by c.trimestre";
        
        List l = springHibernateDao.ejecutarSQL(sql);
        List<VCapaConsolidadoDto> retorno = new ArrayList<VCapaConsolidadoDto>();
        
        for (Object m : l) {            
            Object[] x = (Object[]) m;
            VCapaConsolidadoDto o = new VCapaConsolidadoDto();            
            o.setTrimestre(x[0].toString());
            o.setInversion(BigDecimal.valueOf(Long.valueOf(x[1].toString())));
            retorno.add(o);
        }
        
        return retorno;
    }

    public int obtenerTrimesteCantidadTotal(String anio) throws DAOException {
        List<Object> listaParametros = new ArrayList<Object>();

        String hqsql = "select count(e.id) from VCapaConsolidadoDto as e";
        hqsql += " where e.anio = ?";
        listaParametros.add(anio);
        return Integer.parseInt(springHibernateDao.ejecutarQueryGeneric(hqsql, listaParametros).get(0).toString());
    }
    
    public BigDecimal obtenerTrimesteInversionTotal(String anio) throws DAOException {
        List<Object> listaParametros = new ArrayList<Object>();

        String hqsql = "select sum(e.inversion) from VCapaConsolidadoDto as e";
        hqsql += " where e.anio = ?";
        listaParametros.add(anio);
        return (BigDecimal)(springHibernateDao.ejecutarQueryGeneric(hqsql, listaParametros).get(0));
    }
    
    public int obtenerTrimesteCantidadPorEjecutar(String anio) throws DAOException {
        List<Object> listaParametros = new ArrayList<Object>();

        String hqsql = "select count(e.id) from VCapaConsolidadoDto as e ";
        hqsql += "where e.anio = ? and e.idEstado <> ?";
        listaParametros.add(anio);
        listaParametros.add(ConstantesCapa.Parametro.PROGRAMACION_EJECUTADO);
        return Integer.parseInt(springHibernateDao.ejecutarQueryGeneric(hqsql, listaParametros).get(0).toString());
    }
    
    public BigDecimal obtenerTrimesteInversionPorEjecutar(String anio) throws DAOException {
        List<Object> listaParametros = new ArrayList<Object>();

        String hqsql = "select sum(e.inversion) from VCapaConsolidadoDto as e ";
        hqsql += "where e.anio = ? and e.idEstado <> ?";
        listaParametros.add(anio);
        listaParametros.add(ConstantesCapa.Parametro.PROGRAMACION_EJECUTADO);
        return (BigDecimal)(springHibernateDao.ejecutarQueryGeneric(hqsql, listaParametros).get(0));
    }

    public List<VCapaConsolidadoDto> obtenerConFiltroConOrden(Map<String, Object> filtros, Map<String, String> orden) throws DAOException {
        return springHibernateDao.obtenerDtosConFiltrosConOrden(VCapaConsolidadoDto.class, filtros, orden);
    }
}
